const { DataTypes } = require('sequelize');
const bcrypt = require('bcryptjs');
const { sequelize } = require('../config/db');

/**
 * 用户模型类
 * 映射数据库users表，提供用户相关的数据访问和方法
 */
class User {
  constructor() {
    // 定义模型结构
    this.model = sequelize.define('User', {
      id: {
        type: DataTypes.BIGINT,
        primaryKey: true,
        autoIncrement: true
      },
      username: {
        type: DataTypes.STRING(50),
        allowNull: false,
        unique: true
      },
      password: {
        type: DataTypes.STRING(255),
        allowNull: false
      },
      email: {
        type: DataTypes.STRING(100),
        allowNull: false,
        unique: true
      },
      avatar: {
        type: DataTypes.STRING(255),
        allowNull: true
      },
      nickname: {
        type: DataTypes.STRING(50),
        allowNull: true
      },
      status: {
        type: DataTypes.TINYINT,
        allowNull: false,
        defaultValue: 1
      },
      created_at: {
        type: DataTypes.DATE,
        allowNull: false
      },
      updated_at: {
        type: DataTypes.DATE,
        allowNull: false
      },
      role: {
        type: DataTypes.ENUM('user', 'admin'),
        allowNull: false,
        defaultValue: 'user'
      },
      login_attempts: {
        type: DataTypes.INTEGER,
        allowNull: false,
        defaultValue: 0
      },
      lock_until: {
        type: DataTypes.DATE,
        allowNull: true
      },
      deleted_at: {
        type: DataTypes.DATE,
        allowNull: true
      },
      last_login_ip: {
        type: DataTypes.STRING(50),
        allowNull: true
      },
      last_login_at: {
        type: DataTypes.DATE,
        allowNull: true
      },
      login_count: {
        type: DataTypes.INTEGER,
        allowNull: false,
        defaultValue: 0
      },
      password_reset_token: {
        type: DataTypes.STRING(200),
        allowNull: true
      },
      password_reset_expires: {
        type: DataTypes.INTEGER,
        allowNull: true
      }
    }, {
      tableName: 'users',
      timestamps: false,
      paranoid: true,
      deletedAt: 'deleted_at',
      hooks: {
        /**
         * 保存前加密密码
         */
        beforeCreate: async (user) => {
          if (user.password) {
            // 检查密码是否已经是加密的（避免重复加密）
            if (user.password.length < 60) {
              user.password = await bcrypt.hash(user.password, 10);
            }
          }
        },
        beforeUpdate: async (user) => {
          if (user.password && user.changed('password')) {
            // 检查密码是否已经是加密的
            if (user.password.length < 60) {
              user.password = await bcrypt.hash(user.password, 10);
            }
          }
        }
      }
    });

    // 添加实例方法
    this.model.prototype.validatePassword = async function(password) {
      return await bcrypt.compare(password, this.password);
    };
  }

  /**
   * 获取模型实例
   * @returns {Model} - Sequelize模型实例
   */
  getModel() {
    return this.model;
  }

  /**
   * 根据ID查找用户
   * @param {number} id - 用户ID
   * @returns {Promise<Object|null>} - 用户对象或null
   */
  async findById(id) {
    return await this.model.findByPk(id);
  }

  /**
   * 根据用户名查找用户
   * @param {string} username - 用户名
   * @returns {Promise<Object|null>} - 用户对象或null
   */
  async findByUsername(username) {
    return await this.model.findOne({ where: { username } });
  }

  /**
   * 根据邮箱查找用户
   * @param {string} email - 邮箱地址
   * @returns {Promise<Object|null>} - 用户对象或null
   */
  async findByEmail(email) {
    return await this.model.findOne({ where: { email } });
  }

  /**
   * 创建新用户
   * @param {Object} userData - 用户数据
   * @returns {Promise<Object>} - 创建的用户对象
   */
  async create(userData) {
    const now = new Date();
    return await this.model.create({
      ...userData,
      created_at: now,
      updated_at: now
    });
  }
}

// 导出User类的实例
const userInstance = new User();
const UserModel = userInstance.getModel();

module.exports = UserModel;
module.exports.UserClass = User;
module.exports.userInstance = userInstance;